package cn.newgrand.netcall.personal.contact.service;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.UserManager;
import org.jivesoftware.spark.util.log.Log;

import cn.newgrand.common.CommonUtil;
import cn.newgrand.netcall.personal.contact.PersonalContactDef;
import cn.newgrand.netcall.personal.contact.PersonalContactManager;
import cn.newgrand.netcall.personal.contact.entity.FrequentContact;
import cn.newgrand.netcall.personal.contact.entity.PersonalContact;
import cn.newgrand.netcall.personal.contact.entity.PersonalGroup;

/**
 * @author SidneyRen E-mail:SidneyRen@hotmail.com
 * @version create time：2010-10-11 下午08:32:00
 * 类说明
 * 
 * 主要对界面操作功能的实现
 * 
 * 包括：自定义组的添加、修改、删除及其中人员的添加修改删除
 * 	常用部门、常用联系人的增、删、改操作
 * 	
 */
public class PersonalContactHandler {
	
	private PersonalContact cachedPC = PersonalContactManager.getInstance().getCachedPersonalContact();
	private Map<String,PersonalGroup> personalContactMap = new HashMap<String, PersonalGroup>();
	
	/**
	 * 增加常用联系人
	 * @param fc 常用联系人实体类
	 */
	public void addFrequentContact(FrequentContact fc){
		if(null==fc) return;
		cachedPC.getFrequentContacts().add(fc);
		save();
	}
	
	/**
	 * 删除常用联系人
	 * @param jid 联系人的唯一jid
	 */
	public void deleteFrequentContact(String jid){
		if(CommonUtil.isEmpty(jid))return;
		cachedPC.getFrequentContacts().remove(new FrequentContact("jid",""));
		save();
	}
	
	/**
	 * 获取所有的常用联系人
	 */
	public Collection<FrequentContact> getAllFrequentContacts(){
		return cachedPC.getFrequentContacts();
	}
	
	/**
	 * 增加常用部门
	 * @param deptName 常用部门名称 唯一
	 */
	public void addFrequentDept(String deptName){
		if(CommonUtil.isEmpty(deptName))return;
		cachedPC.getFrequentDepts().add(deptName);
		save();
	}
	/**
	 * 删除常用部门
	 * @param deptName 常用部门名称 唯一
	 */
	public void deleteFrequentDept(String deptName){
		if(CommonUtil.isEmpty(deptName))return;
		cachedPC.getFrequentDepts().remove(deptName);
		save();
	}
	
	/**
	 * 获取所有的常用部门
	 */
	public Collection<String> getAllFrequentDepts(){
		return cachedPC.getFrequentDepts();
	}
	
	/**
	 * 添加自定义组
	 * 
	 * 注意：得判断自定义组名称是否相同
	 * 
	 * @param name 自定义组名称 唯一
	 */
	public void addPersonalGroup(String groupName){
		if(CommonUtil.isEmpty(groupName))return;
		PersonalGroup pg = new PersonalGroup();
		pg.setName(groupName);
		cachedPC.getPersonalGroups().put(groupName,pg);
		save();
	}
	/**
	 * 根据自定义组名称
	 * 得到该自定义组实体
	 * @param groupName
	 * @return
	 */
	public PersonalGroup getPersonalGroupByName(String groupName){
		return cachedPC.getPersonalGroups().get(groupName);
	}
	
	/**
	 * 添加组成员
	 * @param groupName
	 * @param members
	 */
	public void addPersonalGroupMember(String groupName,String jid){
		if(CommonUtil.isEmpty(groupName))return;
		if(CommonUtil.isEmpty(jid))return;
		PersonalGroup pg = cachedPC.getPersonalGroups().get(groupName);
		if(null==pg)return;
		pg.getMembers().add(jid);
		save();
	}
	
	/**
	 * 批量添加/更新组成员
	 * @param groupName
	 * @param members
	 */
	public void addPersonalGroupMembers(String groupName,Collection<String> members){
		if(CommonUtil.isEmpty(groupName))return;
		if(CommonUtil.isEmpty(members))return;
		PersonalGroup pg = cachedPC.getPersonalGroups().get(groupName);
		if(null==pg)return;
		for(String jid:members){
			pg.getMembers().add(jid);
		}
		save();
	}
	
	/**
	 * 根据组名以及成员jid
	 * 删除自定义组的成员
	 * 
	 * @param groupName
	 * @param jid
	 */
	public void deletePersonalGroupMember(String groupName,String jid){
		if(CommonUtil.isEmpty(groupName))return;
		if(CommonUtil.isEmpty(jid))return;
		PersonalGroup pg = cachedPC.getPersonalGroups().get(groupName);
		if(null==pg) return;
		pg.getMembers().remove(jid);
		save();
	}
	/**
	 * 根据组名以及成员列表
	 * 删除自定义组的成员
	 * 
	 * @param groupName
	 * @param jid
	 */
	public void deletePersonalGroupMember(String groupName,Collection<String> members){
		if(CommonUtil.isEmpty(groupName))return;
		if(CommonUtil.isEmpty(members))return;
		for(String jid :members){
			deletePersonalGroupMember(groupName,jid);
		}
		save();
	}
	
	/**
	 * 删除自定义组
	 * 
	 * @param name 自定义组的名称
	 */
	public void deletePersonalGroup(String groupName){
		if(CommonUtil.isEmpty(groupName))return;
		cachedPC.getPersonalGroups().remove(groupName);
		save();
	}
	
	/**
	 * 获取所有的自定义组
	 */
	public Map<String,PersonalGroup> getAllPersonalGroups(){
		return cachedPC.getPersonalGroups();
	}
	
	/**
	 * 根据自定义组名称得到该自定义组
	 * @param name
	 */
	public PersonalGroup getPersonalGroup(String groupName){
		return cachedPC.getPersonalGroups().get(groupName);
	}
	
	
    /**
     * 保存当前的PersonalContact到本地personal_contact_setting.xml
     */
	public void save() {
		File personalContactFile = cachedPC.getPersonalContactFile();
		if (!personalContactFile.exists()) {
			// Write out new File
			personalContactFile.getParentFile().mkdirs();
		}
		try {
			BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(personalContactFile), "UTF-8"));
			out.write(cachedPC.getChildElementXML());
			out.close();
		} catch (IOException e) {
			Log.error(e);
		}
		return;
	}

}
